#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 创建动画对象空间
    p_Animation = new QPropertyAnimation();
    // 设置动画曲线
    p_Animation->setEasingCurve(QEasingCurve::Linear);
}

MainWindow::~MainWindow()
{
    qDebug()<<"MainWindow::~MainWindow()";

    delete p_Animation;
    delete animationGroup;
    delete ui;
}


// 移动
// 方法1：循环a->b
// 方法2: 循环a->b->a
void MainWindow::on_pb_move_clicked()
{
#if 0
    // pos:按点移动的动画（移动）
    // 设置作用的目标控件 方法一
    p_Animation->setTargetObject(ui->pb_move);
    p_Animation->setPropertyName("pos");                            // 指定动画属性名
    p_Animation->setDuration(10000);                                // 动画时间
    p_Animation->setStartValue(ui->pb_move->pos());                 // 起始位置
    p_Animation->setEndValue(ui->pb_move->pos() + QPoint(this->width() - ui->pb_move->width() - 10,ui->pb_move->y()));   // 结束位置
    p_Animation->setLoopCount(-1);  // 将动画循环次数设置为-1，表示动画将一直重复播放，直到窗口关闭。
    p_Animation ->start(); // 启动动画

#else
    // 获取起始位置和结束位置 方法二
    QPoint startPosition = ui->pb_move->pos();
    QPoint endPosition = ui->pb_move->pos() + QPoint(this->width() - ui->pb_move->width() - 10, ui->pb_move->y());

    // 创建两个动画，一个从起始位置到结束位置，另一个从结束位置到起始位置
    QPropertyAnimation* forwardAnimation = new QPropertyAnimation(ui->pb_move, "pos");
    forwardAnimation->setDuration(10000);
    forwardAnimation->setStartValue(startPosition);
    forwardAnimation->setEndValue(endPosition);
    // 设置动画曲线(缓和曲线)
    forwardAnimation->setEasingCurve(QEasingCurve::OutBounce);

    QPropertyAnimation* backwardAnimation = new QPropertyAnimation(ui->pb_move, "pos");
    backwardAnimation->setDuration(10000);
    backwardAnimation->setStartValue(endPosition);
    backwardAnimation->setEndValue(startPosition);
    // 设置动画曲线(缓和曲线)
    backwardAnimation->setEasingCurve(QEasingCurve::OutBounce);

    // 创建串行动画组，并将两个动画添加到动画组中
    animationGroup = new QSequentialAnimationGroup(this);
    animationGroup->addAnimation(forwardAnimation);
    animationGroup->addAnimation(backwardAnimation);

    // 将动画组设置为循环播放
    animationGroup->setLoopCount(-1);

    // 启动动画组
    animationGroup->start();
#endif
}

// 缩放
void MainWindow::on_pb_geometry_clicked()
{
    // geometry:按矩形的动画（移动和缩放）
    // 设置作用的目标控件
    p_Animation->setTargetObject(ui->pb_geometry);
    p_Animation->setPropertyName("geometry");   //指定动画属性名
    p_Animation->setDuration(10000);            //设置动画时间（单位：毫秒）

    // 获取控件初始的大小
    int width = ui->pb_geometry->rect().width();
    int height = ui->pb_geometry->rect().height();
    QPoint pos = ui->pb_geometry->pos();

    // 设置初始位置和大小
    p_Animation->setStartValue(QRect(pos, QSize(width, height)));
    // 设置放大的动画路线(左上角坐标(x,y)减小,(wh)宽高增大)
    p_Animation->setKeyValueAt(0.5, QRect(pos - QPoint(50, 25), QSize(width + 100, height + 50)));
    // 设置缩小的动画路线
    p_Animation->setEndValue(QRect(pos, QSize(width, height)));

    // 启动动画
    p_Animation->start();
}

// 透明度
void MainWindow::on_pb_opacity_clicked()
{
    // Opacity：不透明度（注意该效果只对顶级窗口有效哦）
    // 设置作用的目标控件
    p_Animation->setTargetObject(this);             //重设动画使用对象
    p_Animation->setPropertyName("windowOpacity");  //指定动画属性名
    p_Animation->setDuration(5000);                 //设置动画时间（单位：毫秒）

    // 设置动画步长值，以及在该位置时显示的透明度 1-0.3-1
    // 设置动画的关键帧值，表示在动画的起始位置（0）时，窗口的不透明度为100%（即完全不透明）。
    p_Animation->setKeyValueAt(0, 1);
    // 在动画的一半位置（0.5），窗口的不透明度为0.3（即透明增加）。
    p_Animation->setKeyValueAt(0.5, 0.3);
    // 在动画的结束位置（1），窗口的不透明度为100%（即完全不透明）。
    p_Animation->setKeyValueAt(1, 1);

    p_Animation->setLoopCount(-1);  // 将动画循环次数设置为-1，表示动画将一直重复播放，直到窗口关闭。
    p_Animation->start();           // 启动动画，使其生效。
}

// 停止动画 停止在当前动画运行阶段
void MainWindow::on_pb_stop_clicked()
{
    p_Animation->stop();

    // 停止动画组
    animationGroup->stop();
}

// 开启动画 从起始重新开始而不是续上之前未完成的
void MainWindow::on_pb_start_clicked()
{
    p_Animation->start();

    // 启动动画组
    animationGroup->start();
}
